package com.wgzx.modbus.entity.response;

import com.wgzx.modbus.constant.FunctionCode;
import com.wgzx.modbus.entity.ModbusRsp;
import io.netty.buffer.ByteBuf;
import lombok.Getter;

/**
 * 请求报文：<br/>
 * 功能码：0x05 写单个线圈 <br/>
 * 输出地址：2个字节0x0000至0xFFFF <br/>
 * 输出值：2个字节0x0000(表示false)或0xFF00(表示true) <br/>
 *
 * 响应报文：<br/>
 * 功能码：0x05 写单个线圈 <br/>
 * 输出地址：2个字节0x0000至0xFFFF <br/>
 * 输出值：2个字节0x0000(表示false)或0xFF00(表示true) <br/>
 *
 * 示例报文：<br/>
 * Rx:00 01(事务ID) 00 00(协议标识) 00 06(长度) FF(单元标识符) 05(功能码) 00 04(偏移量) FF 00(这个表示true)<br/>
 * Tx:00 01(事务ID) 00 00(协议标识) 00 06(长度) FF(单元标识符) 05(功能码) 00 04(偏移量) FF 00(这个表示true)<br/>
 * 备注：请求数据域中的常量说明请求的 ON/OFF 状态。十六进制值0xFF00请求输出为ON，十六进制值0x0000请求输出为OFF，其它所有值均是非法的，并且对输出不起作用。<br/>
 *
 * @author gexin
 */
@Getter
public class WriteSingleCoilResponse extends ModbusRsp {

    private boolean state;
    private int address;

    public WriteSingleCoilResponse(FunctionCode functionCode) {
        super(functionCode);
    }

    @Override
    public void decode(ByteBuf buffer) {
        address = buffer.readUnsignedShort();
        state = buffer.readUnsignedShort() == 0xFF00;
    }

    @Override
    public String toString() {
        return "WriteSingleCoil{" + "outputAddress=" + address + ", state=" + state + '}';
    }
}
